#!/bin/bash 

# clone 指定目录
BASE_DIR_GIT_PROJECT=""

declare -A GitRepositoryMap=(
    [note]="https://gitee.com/zhouzmo/note.git"
    [av]="https://gitee.com/zhouzmo/learn_audio_video_development.git"
    [c]="https://gitee.com/zhouzmo/learn_c.git"
    [ai]="https://gitee.com/zhouzmo/learn_artificial_intelligence.git"
    [cpp]="https://gitee.com/zhouzmo/learn_cpp.git"
    [py]="https://gitee.com/zhouzmo/learn_python.git"
    [sh]="https://gitee.com/zhouzmo/learn_shell.git"
    [srs]="https://gitee.com/zhouzmo/srs.git"
)

FSTR="[z:::]"

# 文字颜色
RED_S="\033[31m"     # 红色 (错误)
GEN_S="\033[32m"     # 绿色 (成功)
YEL_S="\033[33m"     # 黄色 (警告)
BLU_S="\033[34m"     # 蓝色 (信息)
PUR_S="\033[35m"     # 紫色 (特殊)
CYA_S="\033[36m"     # 青色 (提示)
WHT_S="\033[37m"     # 白色 (普通)

# 高亮颜色（加粗）
B_RED_S="\033[1;31m" # 红色加粗
B_GEN_S="\033[1;32m" # 绿色加粗
B_YEL_S="\033[1;33m" # 黄色加粗
B_BLU_S="\033[1;34m" # 蓝色加粗
B_PUR_S="\033[1;35m" # 紫色加粗
B_CYA_S="\033[1;36m" # 青色加粗
B_WHT_S="\033[1;37m" # 白色加粗

# 背景颜色
BG_RED="\033[41m"    # 红色背景
BG_GEN="\033[42m"    # 绿色背景
BG_YEL="\033[43m"    # 黄色背景
BG_BLU="\033[44m"    # 蓝色背景
BG_PUR="\033[45m"    # 紫色背景
BG_CYA="\033[46m"    # 青色背景
BG_WHT="\033[47m"    # 白色背景

COLOR_E="\033[0m"

# 捕获 Ctrl+C 退出
trap "echo -e \"${FSTR}${RED_S}操作被用户中断！${COLOR_E}\"; exit 1" INT

# 检查 Bash 版本
if ((BASH_VERSINFO[0] < 4)); then
    echo -e "${FSTR}${RED_S}此脚本需要 bash 4.0 及以上版本！${COLOR_E}"
    exit 1
fi

# 获取仓库名
func_extract_repo_name() {
    echo "$(basename "$1" .git)"
}

# 并行 push 代码
func_pull_and_push() {
    local repo_path="$1"
    local repo_name="$2"

    echo -e "${FSTR}${PUR_S}正在处理仓库: ${repo_name} (${repo_path})${COLOR_E}"

    # 检测是否是 Git 仓库
    if ! git -C "$repo_path" rev-parse --is-inside-work-tree &>/dev/null; then
        echo -e "${FSTR}${RED_S}错误: ${repo_path} 不是 Git 仓库，跳过！${COLOR_E}"
        return 1
    fi

    # 拉取最新代码
    git -C "$repo_path" pull --rebase --autostash &>/dev/null || {
        echo -e "${FSTR}${RED_S}拉取失败 (${repo_name})，尝试 stash 变更后重新拉取...${COLOR_E}"
        git -C "$repo_path" stash && git -C "$repo_path" pull --rebase && git -C "$repo_path" stash pop
    }

    # 判断是否有变更
    #if git -C "$repo_path" diff --quiet HEAD; then
    #    echo -e "${FSTR}${YEL_S}没有变更，跳过提交和推送 (${repo_name})。${COLOR_E}"
    #    return 0
    #fi

    git -C "$repo_path" add .
    git -C "$repo_path" commit -m "🚀 Commit from ${repo_name} - $(date +'%Y-%m-%d %H:%M:%S')" &>/dev/null
    echo -e "${FSTR}${GEN_S}代码已提交 (${repo_name})，准备推送...${COLOR_E}"

    git -C "$repo_path" push --quiet
    if [ $? -eq 0 ]; then
        echo -e "${FSTR}${GEN_S}代码推送完成 (${repo_name})！${COLOR_E}"
    else
        echo -e "${FSTR}${RED_S}推送失败 (${repo_name})，请检查！${COLOR_E}"
        return 1
    fi
    return 0
}

CURRENT_PATH=$(pwd)

# 检查参数
if [ $# -lt 2 ]; then
    echo -e "${FSTR}${RED_S} 使用方法: code_git.sh [operate] [repositoryKey] ${COLOR_E}"
    for key in "${!GitRepositoryMap[@]}"; do
        echo -e "$key \t $(func_extract_repo_name "${GitRepositoryMap[$key]}")"
    done
    exit 1
fi

INPUT_GIT_OPERATE="$1"
INPUT_GIT_REPOSITORY_KEY="$2"

# 处理 "all" 关键字
if [ "$INPUT_GIT_REPOSITORY_KEY" = "all" ]; then
    SELECTED_KEYS=("${!GitRepositoryMap[@]}")
else
    if [[ -z "${GitRepositoryMap[$INPUT_GIT_REPOSITORY_KEY]}" ]]; then
        echo -e "${FSTR}${RED_S}Error: 指定的仓库键 '$INPUT_GIT_REPOSITORY_KEY' 不存在。${COLOR_E}"
        exit 1
    fi
    SELECTED_KEYS=("$INPUT_GIT_REPOSITORY_KEY")
fi

# 执行操作
for key in "${SELECTED_KEYS[@]}"; do
    repo_url="${GitRepositoryMap[$key]}"
    repo_name=$(func_extract_repo_name "$repo_url")
    repo_path="${CURRENT_PATH}/${BASE_DIR_GIT_PROJECT}${repo_name}"

    case "$INPUT_GIT_OPERATE" in
        clone)
            if [ -d "$repo_path/.git" ]; then
                echo -e "${FSTR}${YEL_S}仓库 ${repo_name} 已存在，执行 pull 更新...${COLOR_E}"
                git -C "$repo_path" pull --quiet &
            else
                echo -e "${FSTR}${YEL_S}正在克隆 ${repo_url} 到 ${repo_path} ...${COLOR_E}"
                git clone --depth=1 "$repo_url" "$repo_path" --quiet &
            fi
            ;;
        push)
            func_pull_and_push "$repo_path" "$repo_name" &
            ;;
    esac
done

wait  # 等待所有后台任务完成

echo -e "${FSTR}${GEN_S}所有操作已完成！${COLOR_E}"
